//
//  RXUserAccount.swift
//  weibo
//
//  Created by uncle-R on 15/12/19.
//  Copyright © 2015年 uncle-R. All rights reserved.
//

import UIKit

class RXUserAccount: NSObject,NSCoding{
    //定义类属性.不用创建对象就可以调用
    //计算属性,只提供get方法
    
    class var userIslogin: Bool{
        //调用加载账号.进行判断.
        if RXUserAccount.loadUserAccount() == nil{
            return false
        }
        return true
    }
    ///用户昵称
    var screen_name: String?
    ///用户头像地址 (大图)
    var avatar_large: String?
    
    
    
    
    /// AccessToken
    var access_token: String?
    
    /// 当前授权用户的UID
    var uid: String?
    
    /// access_token的生命周期，单位是秒数,新浪文档上写的是String，实际上返回的是Int类型
    /// Int/Float/Double类型不能定义为可选,定义为可选KVC找不到
    
    var expires_in: NSTimeInterval = 0 {
        
        didSet {
            // 自己来生成,过期时间NSDate
            expires_Date = NSDate(timeIntervalSinceNow: expires_in)

        }
    }
    //过期时间
    var expires_Date: NSDate?
    
    init(dict:[String: AnyObject]){
        super.init()
        
        setValuesForKeysWithDictionary(dict)

    }
    //当字典的key在模型里面找不到属性的时候会调用 ---重写为了 有些属性模型里面没有定义 赋值的时候不会报错
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
//MARK: - 归档 ---解档
    
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_Date, forKey: "expires_Date")
        aCoder.encodeObject(avatar_large,forKey: "avatar_large")
        aCoder.encodeObject(screen_name,forKey: "screen_name")
        
    }
    //解档
    required init?(coder aDecoder: NSCoder){
        
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_Date = aDecoder.decodeObjectForKey("expires_Date") as? NSDate
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
        screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        
    }
    //拼接沙盒路径
    //拼接文件名
    static let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.plist")
    
    //保存账户信息
    func saveUserAccount(){
        
        // rootObject: 要归档的对象
        // toFile: 保存的路径
        NSKeyedArchiver.archiveRootObject(self, toFile: RXUserAccount.path)
        
    }
    //程序一开始没有账号需要解档,写成类方法比较合适
    //用户账户信息不一定存在,没有登陆,AccessToken过期了
    
    //函数前加class表示 这个方法为类方法.
    class func loadUserAccount()->RXUserAccount?{
        
        //解档
        if let userAccout = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? RXUserAccount{
            //如果进来 说明至少有账号 还要进行判断
            //如果过期时间与当前时间对比 结果为降序的话,说明账号没有过期
            if userAccout.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
                print("加载到账号可用")
                return userAccout
            }
            else{
                print("账号过期")
                return nil
            }
        }
        else{
            print("没有加载到可用的账号")
        }
        return nil
    }
    
    // loadUserAccount方法调用是比较频繁的,每次去沙盒解档账号需要消耗一些性能,当有可用的账号时,保存到对象的属性(内存中,效率非常高).下次使用时,直接使用属性(内存中的账号),目的--->可以提高性能
    static var userAccount: RXUserAccount?

    //加载用户数据.
    func loadUserInfo(finished: (error: NSError?)->()) {
        //调用网络工具类加载用户信息,准备一个闭包
        RXNetworkTool.sharedInsatance.loadUserInfo { (result, error) -> () in
            
            if error != nil || result == nil {
                print("获取用户数据有错误:\(error)")
                finished(error: error)//传出错误
                return
            }
            
            self.screen_name = result!["screen_name"] as? String
            
            self.avatar_large = result!["avatar_large"] as? String
            
            //将对象保存到沙河中
            self.saveUserAccount()
            //将最新的对象赋值给 可用账号 下次加载可以直接使用可用账号 提高性能
            RXUserAccount.userAccount = self
            
            //通知闭包 获取用户数据成功
            finished(error: nil)
            
        }
        
    }
    

}
